//
//  PeripheralModels.swift
//  Nexs
//
//  Created by roni on 2025/7/30.
//

import Foundation
import CoreBluetooth

// MARK: - 外设广播状态
public enum PeripheralBroadcastState {
    case idle           // 空闲状态
    case starting       // 启动中
    case broadcasting   // 广播中
    case stopping       // 停止中
    case failed         // 失败状态
}

// MARK: - 广播配置
/// 蓝牙外设广播配置结构体，用于配置广播的各种参数
public struct BroadcastConfiguration {
    /// 广播时长（秒），nil表示持续广播直到手动停止
    public let duration: TimeInterval?
    
    /// 要广播的服务UUID列表 - 用作获取房间号的 id
    public let serviceUUID: CBUUID
    
    /// 设备本地名称，会在广播中显示,  这里用作房间号
    public let roomId: String
    
    /// 日志接口
    public let logger: BluetoothLogable
    
    /// 初始化广播配置
    /// - Parameters:
    ///   - duration: 广播时长（秒），nil表示持续广播
    ///   - serviceUUID: 服务UUID字符串数组,  用作获取房间号的 id
    ///   - localName: 设备显示名称, 这里用作房间号
    ///   - logger: BluetoothLogger 默认实现
    ///   建议： 不需要的数据都不要配置，避免广播包太大，无法发送
    public init(
        duration: TimeInterval? = nil,
        serviceUUID: String,
        roomId: String,
        logger: BluetoothLogable = BluetoothPeripheralLogger()
    ) {
        self.duration = duration
        self.serviceUUID = CBUUID(string: serviceUUID)
        self.roomId = roomId
        self.logger = logger
    }
    
    /// 生成CoreBluetooth广播数据字典
    internal var advertisementData: [String: Any] {
        var data: [String: Any] = [:]
        
        // 设置服务UUID列表
        data[CBAdvertisementDataServiceUUIDsKey] = [serviceUUID]
        
        // 设置设备名称
        data[CBAdvertisementDataLocalNameKey] = roomId
        
        return data
    }
}

// MARK: - 广播统计信息
/// 广播会话的统计信息
public struct BroadcastStatistics {
    /// 广播开始时间
    public let startTime: Date
    
    /// 广播结束时间，nil表示仍在广播中
    public let endTime: Date?
    
    /// 广播持续时间（秒）
    public let duration: TimeInterval
    
    /// 是否仍在广播中
    public let isActive: Bool
    
    /// 连接过的中央设备数量
    public let connectionCount: Int
    
    public init(startTime: Date, endTime: Date? = nil, connectionCount: Int = 0) {
        self.startTime = startTime
        self.endTime = endTime
        self.duration = endTime?.timeIntervalSince(startTime) ?? Date().timeIntervalSince(startTime)
        self.isActive = endTime == nil
        self.connectionCount = connectionCount
    }
}

// MARK: - 外设错误类型
/// 外设操作相关的错误类型
public enum PeripheralError: Error {
    case bluetoothNotAvailable      // 蓝牙不可用
    case bluetoothNotAuthorized     // 蓝牙未授权
    case bluetoothPoweredOff        // 蓝牙未开启
    case startBroadcastFailed       // 启动广播失败
    case stopBroadcastFailed        // 停止广播失败
    case invalidConfiguration       // 无效的配置
    case advertisementDataTooLarge  // 广播数据过大
    case serviceCreationFailed      // 服务创建失败
    
    public var description: String {
        switch self {
        case .bluetoothNotAvailable:
            return "设备不支持蓝牙功能"
        case .bluetoothNotAuthorized:
            return "蓝牙权限未授权，请在设置中开启"
        case .bluetoothPoweredOff:
            return "蓝牙未开启，请开启蓝牙后重试"
        case .startBroadcastFailed:
            return "启动广播失败"
        case .stopBroadcastFailed:
            return "停止广播失败"
        case .invalidConfiguration:
            return "广播配置无效"
        case .advertisementDataTooLarge:
            return "广播数据过大，请减少数据量"
        case .serviceCreationFailed:
            return "创建蓝牙服务失败"
        }
    }
} 
